<?php
Zend_Loader::loadClass("Application_Ajax_Server_Function");
Zend_Loader::loadClass('Constructions');
Zend_Loader::loadClass('ConstructionPropsPhysical');
Zend_Loader::loadClass('ConstructionPropsThermal');
Zend_Loader::loadClass('ConstructionsMaterials');

class SaveConstruction extends Application_Ajax_Server_Function
{
	public function call() {
		foreach ($this->_params as &$param) {
			$param = urldecode($param);
		}
		$esito = null;
		Model::getDefaultAdapter()->beginTransaction();
		$scenario = $this->_getParam('id', 0) ? "update" : "new";

		$rel = new ConstructionsMaterials();

		try {
			$costruzioni = new Constructions();
			$costruzione = ($scenario == "new") ? $costruzioni->createRow() : $costruzioni->fetchRow($costruzioni->select()->where('id = ?', $this->_getParam('id')));
			// costruzione
			$costruzione->name = $this->_getParam('construction_name', '');
			$costruzione->description = $this->_getParam('construction_descr', '');
			$costruzione->id_category = $this->_getParam('construction_category_id', null);
			$costruzione->source = $this->_getParam('construction_source', '');
			$costruzione->status = 1;

			$costruzione->save();
			if ($scenario == "new") {
				$id_costruzione = $costruzioni->getAdapter()->lastInsertId();
			} else {
				$id_costruzione = $this->_getParam('id');
			}

			// Strati (materiali)
			$rel = new ConstructionsMaterials();
			// Strati: rimozione
			$recordSet = $rel->select()->from($rel, array('id_construction','id_material','layer'))->where("id_construction = ?", array($id_costruzione));
			$rels = $rel->fetchAll($recordSet);
			foreach ($rels as $r) {
				$r->delete();
			}
			//$r->save();
			// Strati: scrittura
			// ...
			ksort($this->_params);
			foreach ($this->_params as $k => $s) {
				$exp = explode("_", $k);
				if ($exp[0] == "new"){
					if ($exp[3] == "id")
						$app[0] = $s;
					elseif ($exp[3] == "thickness")
					$app[1] = $s;
				}
				if(!empty($app[0]) && !empty($app[1])) {
					$app2[] = array($app[0], $app[1]);
					$app = array();
				}
			}

			//Qui le linee di codice per memorizzare nel database
			$i = 0;
			foreach ($app2 as $mat) {
				$relProps = $rel->createRow();
				$relProps->id_construction = $id_costruzione;
				$relProps->id_material = $mat[0];
				$relProps->layer = ++$i;
				$relProps->thickness = $mat[1];
				$relProps->save();
			}

			// proprietà fisiche
			$phy = new ConstructionPropsPhysical();
			$phyProps = ($scenario == "new") ? $phy->createRow() : $phy->fetchRow($phy->select()->where('id = ?', $this->_getParam('id')));

			$phyProps->id = $id_costruzione;
			$phyProps->hci = $this->_getParam('construction_hci', 0);
			$phyProps->rad_i = $this->_getParam('construction_rad_i', 0);
			$phyProps->sri = $this->_getParam('construction_sri', 0);
			$phyProps->hco = $this->_getParam('construction_hco', 0);
			$phyProps->rad_o = $this->_getParam('construction_rad_o', 0);
			$phyProps->sro = $this->_getParam('construction_sro', 0);
			$phyProps->save();

			// proprietà termiche
			$thermal = new ConstructionPropsThermal();
			$thrmProps = ($scenario == "new") ? $thermal->createRow() : $thermal->fetchRow($thermal->select()->where('id = ?', $this->_getParam('id')));

			$thrmProps->id = $id_costruzione;
			$thrmProps->uvalue_sts = $this->_getParam('construction_uvalue_sts', 0);
			$thrmProps->rvalue = $this->_getParam('construction_rvalue', 0);
			$thrmProps->uvalue = $this->_getParam('construction_uvalue', 0);
			$thrmProps->url = $this->_getParam('construction_url', 0);
			$thrmProps->lrl = $this->_getParam('construction_lrl', 0);
			$thrmProps->bs_uvalue_sts = $this->_getParam('construction_bs_uvalue_sts', 0);
			$thrmProps->bs_rvalue = $this->_getParam('construction_bs_rvalue', 0);
			$thrmProps->bs_uvalue = $this->_getParam('construction_bs_uvalue', 0);
			$thrmProps->save();

			Model::getDefaultAdapter()->commit();
			if ($scenario == "new") {
				$msg = "La costruzione è stato aggiunta con successo al database";
			} else {
				$msg = "Le proprietà della costruzione sono state aggiornate con successo";
			}
			$esito = true;

		} catch (Exception $ex) {

			$esito = false;
			Model::getDefaultAdapter()->rollBack();
			echo $ex->getMessage();
			if ($scenario == "new") {
				$msg = "Si è verificato un errore durante l'inserimento della nuova costruzione nel database";
			} else {
				$msg = "Si è verificato un errore durante l'aggiornamento delle proprietà della costruzione nel database";
			}
		}

		$info = array ("esito" => $esito, "id" => $id_costruzione, "messages" => $msg);
		return $info;
	}
}